Cel		:WinRar v2.60 beta 4
Gdzie szuka	:ENTER CD1 LISTOPAD
URL		:www.rarsoft.com
Tools		:SoftIce 3.xx,hiew

Program bardzo przydatny, wersja niezarejestrowana ma troszk ogranicze
m.in.brak moliwoci zapisu rekordu autentyfikacji, nagscreen na starcie
programu,text Evaluation Version na pasku tytuowym, nie umoliwia na
korzystanie z dobrodziejstw rozszerzonej powoki(tak jak WinZip pod
prawym klawiszem myszy w menu Add to "SOMEFILE.SSS").
Program w wersji 2.60 straci moliwo rejestracji poprzez wprowadzenie
seriala bezporednio z programu, stao si to jak to pisze autor WinRara
przez du aktywno grup crackerskich(he,he :).Ale my si tym nie
przejmujemy i przechodimy do rzeczy:

1.Uruchamiamy program, wyskakuje nagscreen, idziemy do menu Options, nastpnie
Settings, sprawdzamy czy jest moliwe zapisanie rekordu autentyfikacji(data
stworzenia archiwum, ostatni upgrade archiwum itp.).Klikamy wic na Put
authenticity verification, wyskakuje message z textem 
"Available in registered version only"
2.Ok, wchodzimy do SoftIce'a zakadamy, e message z powyszym textem
to standardowe wywoanie API MessageBoxA na ktre zakadamy puapk
MessageBoxA do "d esp->8;p ret;".Wychodzimy z SI
3.Klikamy ponownie na Put authenticity verification, ekran mign
pojawio si okienko funkcji MessageBoxA.Klikamy OK, jestemy w
SI, w oknie z danymi widzimy text Available in registered version only
Spisujemy adres virtualny skd nastpio wywoanie MessageBoxA, u mnie
jest to adres 404F64.
4.adujemy WinRar.exe do W32dsm-a nastpnie Goto Code Location i
wpisujemy wczeniej zanotowany adres, widzimy kod programu:

* Possible Reference to String Resource ID=00106: "Available in registered version only" <--Text z okienka
                                  |
:00404F5B 6A6A                    push 0000006A
:00404F5D E8C6300000              call 00408028
:00404F62 50                      push eax
:00404F63 53                      push ebx

* Reference To: USER32.MessageBoxA, Ord:0000h-----------------\
                                  |                           /
:00404F64 E8206E0500              Call 0045BD89	;message    <-

5.Przewijamy kod strzakami do gry, moe zobaczymy miejsce z ktrego
nastpi skok pod adres gdzie jestemy:

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00404F3E(C)	<--std nastpi skok
|
:00404F48 803D740C460000          cmp byte ptr [00460C74], 00	<--ciekawe???
:00404F4F 7522                    jne 00404F73
:00404F51 6A30                    push 00000030

* Possible Ref to Menu: MAIN_MENU, Item: ""
                                  |

* Possible Reference to Dialog: ABOUTRARDLG, CONTROL_ID:0065, ""
                                  |

* Possible Reference to String Resource ID=00101: "Warning"
                                  |
:00404F53 6A65                    push 00000065
:00404F55 E8CE300000              call 00408028
:00404F5A 50                      push eax

* Possible Ref to Menu: MAIN_MENU, Item: "Deselect group     Gray -"
                                  |

* Possible Reference to Dialog: CMDWNDADD, CONTROL_ID:006A, ""
                                  |

* Possible Reference to String Resource ID=00106: "Available in registered version only"
                                  |
:00404F5B 6A6A                    push 0000006A
:00404F5D E8C6300000              call 00408028
:00404F62 50                      push eax
:00404F63 53                      push ebx

* Reference To: USER32.MessageBoxA, Ord:0000h
                                  |
:00404F64 E8206E0500              Call 0045BD89
:00404F69 6A00                    push 00000000

Z deadlistingu wynika, e skok do procedurki wywietlajcej nam
MessageBoxA nastpi spod lokacji 00404F3E, ale co ciekawe kod z
procedur wywietlenia MsgBoxA zostaje pominity gdy bajt spod
adresu 00460C74 jest rny od 0

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00404F3E(C)	<--std nastpi skok
|
:00404F48 803D740C460000          cmp byte ptr [00460C74], 00	;bajt spod 460C74 porwnywany z zerem
:00404F4F 7522                    jne 00404F73			;jeeli ten bajt nie jest zerem nastepuje
:00404F51 6A30                    push 00000030			;przeskocznie procki z messagem

6.Bajt spod adresu 00460C74 wydaje si by flag rejestracji,
tzn. program(nie mwi konkretnie o WinRar ale oglnie o rnych programach)
ustawia bajt na np. 1 gdy np.w rejestrze systemowym znajduje si
poprawny klucz dla tego programu i wtedy mamy udostpnione np. wszystkie
funkcji programu.
7.Jak sprawdzi kiedy ustawiany jest bajt spod 00460C74?Ano naley
zaadowa program do SoftIce'a korzystajc z Loadera, nastpnie gdy
Loader zaadowa program do SI i jestemy pod entrypointem zakadamy
puapke na odczyt,zapis pamici o danym zakresie w pamici
bpr 00460C74 00460C75, po zaoeniu puapki naciskamy F5 i pozwalamy
programowi normalnie si uruchomi, a do momentu gdy nastpi zapis
pod 00460C74, wtedy nastpi zatrzymanie dziaania programu.
8.SoftIce zatrzyma dziaanie WinRar-a 2 razy gdy nastpowao zapisywanie
pod adres 00460C74

(1)	:00422F03 E8E83F0100	call 00436EF0------------------------------
	:00422F08 A2740C4600 	mov byte ptr [00460C74], al               |
-----------------------------------------------------------------------   |
(2)	:00417510 E8DBF90100	call 00436EF0  ta sama funkcja <----------/
	:00417515 A2740C4600	mov byte ptr [00460C74], al

Mona sprawdzi, czy naprawd zapisywana jest flaga rejstracji i gdy bedzimy pod
00422F08 zapisujemy w SoftIce do al 1, tak samo postpujemy pod adresem
00417515, nastpnie F5, wow nie pojawi si nagscreen, nie ma textu
Evaluation Version w pasku tytuowym, da si zaznaczy pole
Put authenticity verification bez sowa sprzeciwu ze strony programu.

Widzimy, e pod 00422F08 i 00417515 zostaje zapisana waro rejestru al ktra jest
zalena od procki spod 436EF0, zagldamy wic do owej procki

...

* Possible StringData Ref from Data Obj ->"rarreg.*" <--szuka plikw rarreg.*
                                  |
:00436F19 68381F4600              push 00461F38
...
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00436F8F(U), :00436FEA(U), :004370FD(U), :0043725D(U), :004372C3(U)
|:0043735A(U)
|
:00437389 5F                      pop edi	<--wyjcie z procedury
:0043738A 5E                      pop esi
:0043738B 5B                      pop ebx
:0043738C 8BE5                    mov esp, ebp
:0043738E 5D                      pop ebp
:0043738F C20400                  ret 0004

:00437392 90                      nop
:00437393 90                      nop

* Referenced by a CALL at Addresses:
|:00437079   , :0043708D   , :0043709D   , :004370B1   
|
:00437394 55                      push ebp

Procka ta jest odpowiedzialna za sprawdzenie, czy mamy plik-klucz rarreg.*
, i czy jest on "correct".Gdy plik-klucz jest poprawny w al zwracana jest liczba
rna od 0.Musimy wic tak zrobi aby za kadym razem po wyjciu z procedury
w al zwracana bya liczba rna od zera.Jest jednak may problem, mianowicie
nie ma miejsca gdzie mona zmieci np.

mov	byte ptr[00460C74h],01h

gdy instrukcja ta skada sie ze zbyt duej liczby bajtw, mona sprawdzi pod
hiewem.Widzimy jednak, e pod 437392 znajduj si 2 nopy, ktre zostawi kompilator
dla nas ;).Nie s one czci, adnej porcedury.Moemy to wykorzysta dla naszych
potrzeb, wiemy ,e dopki nie mamy poprawnego pliku klucza procka pod 00436EF0
zawsze zwraca w al 0 wic naley zmieni kod programu tak:

:0043738F FEC0		inc	al
:00437391 C20400	ret 0004

lub
:0043738F 40		inc	eax
:00437390 C20400	ret 0004



suma bajtw orginalnego kodu i zmienionego si zgadza.Sprawdzmy wszystko pod hiewem
(lepiek zrobi najpierw kopi oryginau):
kolejno
-F5
-.43738F kropa na pocztku wymagana
-F3
-wpisujemy kolejno bajty FF,C0,C2,04,00(lub 40,C2,04,00)
-F9 zapisujemy zmiany
-F10 zamykamy hiewa

Uruchamiamy ponownie WinRara, nie ma nagscreena, sprawdzamy dokadnie czy wszystko
chodzi OK, ustawiamy puapk na zapis pod adres 00460C74h, sprbujmy stworzy nowe archiwum
ups...
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040CB2F(C)
|
:0040CB3D 803D740C460000          cmp byte ptr [00460C74], 00
:0040CB44 7410                    je 0040CB56
:0040CB46 803D0822470000          cmp byte ptr [00472208], 00
:0040CB4D 7507                    jne 0040CB56
:0040CB4F C605740C460000          mov byte ptr [00460C74], 00 <--zmienia flage rejestracji na 0

wystarczy
C605740C460000
zmieni na
C605740C460001

zapisujemy zmiany, wszystko ju chodzi jak naley :))

pozdrowienia
bart

email:wojcikb@192.168.1.1